﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using AccesoADatos;
using Entidades;

namespace LogicaDeNegocios
{
    public class Respuestas
    {
        #region Campos

        AuxiliarRespuesta Auxiliar;

        #endregion

        #region Constructor

        public Respuestas()
        {
            Auxiliar = new AuxiliarRespuesta();
        }

        #endregion

        #region Métodos

        #region Agregar Respuesta

        public bool Agregar(Respuesta nuevaRespuesta)
        {
            bool resultado = false;

            try
            {
                
                Respuesta respuestaAgregada = Auxiliar.Agregar(nuevaRespuesta);

                if (respuestaAgregada != null)
                {
                    resultado = true;
                }

            }            
            catch (Exception ex)
            {
                throw (ex);                
            }

            return resultado;
        }



        #endregion

        #region Modificar Respuesta

        public bool Modificar(Respuesta respuestaAModificar)
        {
            bool resultado = false;

            try
            {
                Auxiliar.Modificar(respuestaAModificar);
                resultado = true;

            }
            catch (Exception ex)
            {
                throw (ex);
            }

            return resultado;
        }
        #endregion

        #region Eliminar Respuesta

        public bool Eliminar(Respuesta respuestaAEliminar)
        {
            bool resultado = false;

            try
            {
                Auxiliar.Eliminar(respuestaAEliminar);
                resultado = true;

            }
            catch (Exception ex)
            {
                throw (ex);
            }

            return resultado;
        }

        #endregion        

        #region Listar Respuesta(s)

        public List<Respuesta> Listar(string examenClave = "", short habilidadId = 0,
                                        short preguntaId = 0, byte consecutivo = 0)
        {
            List<Respuesta> resultado = null;

            try
            {            
                resultado = Auxiliar.Listar(examenClave, habilidadId, preguntaId, consecutivo);
            }
            catch (Exception ex)
            {
                throw (ex);
            }
            return resultado;
        }


        #endregion 

        #region Obtener Respuestas

        public List<Respuesta> ObtenerRespuestas(string examenClave = "", short habilidadId = 0, short preguntaId = 0)
        {
            List<Respuesta> resultado = null;

            try
            {
                resultado = Auxiliar.Listar(examenClave, habilidadId, preguntaId);
            }
            catch (Exception ex)
            {
                throw (ex);
            }
            return resultado;
        }

        #endregion

        #region Obtener Respuestas Aleatorias

        public List<RespuestaAleatoria> ObtenerRespuestasAleatorias(string examenClave, short habilidadId, short preguntaId)
        {
            List<RespuestaAleatoria> resultado = null;

            try
            {
                resultado = Auxiliar.Obtener(examenClave, habilidadId, preguntaId);
            }
            catch (Exception ex)
            {                
                throw ex;
            }

            return resultado;
        }
        #endregion         

        #region Verifica si la respuesta esta en el rango de tiempo

        public bool VerificaRespuestaEnRangoTiempo(string codigoExamen, PreguntaAleatoria pregunta)
        {
            LogicaDeNegocios.ExamenesPreguntas ep = new LogicaDeNegocios.ExamenesPreguntas();

            var preguntaExameneAResponder = ep.Listar(codigoExamen, pregunta.ExamenesClave, pregunta.HabilidadesId, pregunta.Id).FirstOrDefault();

            DateTime fechaHoraInicioPregunta = preguntaExameneAResponder.FechaHoraInicio;
            DateTime fechaHoraRespuesta = DateTime.Now;

            double tiempoRespuesta = (fechaHoraRespuesta - fechaHoraInicioPregunta).TotalSeconds;

            bool respuestaEnRangoTiempo = Convert.ToInt16(tiempoRespuesta) <= (pregunta.TiempoEstimado + 30) ? true : false;

            return respuestaEnRangoTiempo;
        }
        
        #endregion

        #region Registra respuesta del usuario

        public bool RegistrarRespuesta(string codigoExamen, PreguntaAleatoria pregunta, char[] respuestas, bool respuestaEnRangoTiempo)
        {
            LogicaDeNegocios.ExamenesPreguntas ep = new LogicaDeNegocios.ExamenesPreguntas();

            var preguntaExameneAResponder = ep.Listar(codigoExamen, pregunta.ExamenesClave, pregunta.HabilidadesId, pregunta.Id).FirstOrDefault();

            bool respuestaAprobada = false;

            if (respuestaEnRangoTiempo)
            {
                respuestaAprobada = new LogicaDeNegocios.Preguntas().CalificarPregunta(pregunta, respuestas);
            }

            preguntaExameneAResponder.RespuestaAprobada = respuestaAprobada;
            preguntaExameneAResponder.ConsecutivosRespuestasUsuario = new string(respuestas);
            preguntaExameneAResponder.FechaHoraFinal = DateTime.Now;

            return ep.Modificar(preguntaExameneAResponder);

        }
        
        #endregion

        #endregion


    }
}
